#include "TerminoSimplificado.h"
#include <iostream>
#include <stdio.h>
#include <string.h>


TerminoSimplificado::TerminoSimplificado(char* termino, int long_ter) {
	this->termino = termino;
	this->longitud_termino = long_ter;
	this->nro_doc = 0;
	this->tamanio = 4+4+long_ter;
}

TerminoSimplificado::~TerminoSimplificado() {
	std::list<Doc_frec*>::iterator it = this->duplas.begin();
	while (it != this->duplas.end()) {
		delete (*it);
		it++;
	}
}

void TerminoSimplificado::agregar_doc(int doc, int frec) {
	Doc_frec* par = new Doc_frec;
	par->doc = doc;
	par->frec = frec;
	this->duplas.push_back(par);
	this->nro_doc++;
	this->tamanio = 4+4+this->tamanio;
}

void TerminoSimplificado::grabar(FILE* salida) {
	char b = '\0';
	char n = '\n';
	fwrite(&this->longitud_termino, sizeof(int), 1, salida);
	fwrite(&this->nro_doc, sizeof(int), 1, salida);
	fwrite(&(*termino),sizeof(char),this->longitud_termino,salida);
	int doc = 0;
	int frec = 0;
	char aux[longitud_termino+1];
	memcpy(aux, termino, longitud_termino);
	aux[longitud_termino] = '\0';
	std::list<Doc_frec*>::iterator it = this->duplas.begin();
	std::cout << "long termino:" <<  longitud_termino << " ";
	std::cout << "cantidad de docs:"<< nro_doc << " ";
	std::cout << "termino:"<< aux << " ";
	while (it != this->duplas.end()) {
		doc = (*it)->doc;
		frec = (*it)->frec;
		std::cout << "id doc:" << doc << " ";
		std::cout << " frec:" << frec << " ";
 		it++;
	}
	std::cout << std::endl;
}

void TerminoSimplificado::grabar(char* buffer, int* pos_actual) {
	memcpy(&buffer[(*pos_actual)], &this->longitud_termino, 4);
	(*pos_actual) = (*pos_actual) + 4;
	memcpy(&buffer[(*pos_actual)], &this->nro_doc, 4);
	(*pos_actual) = (*pos_actual) + 4;
	memcpy(&buffer[(*pos_actual)], (&(*termino)), this->longitud_termino);
	(*pos_actual) = (*pos_actual) + this->longitud_termino;
	int doc = 0;
	int frec = 0;
	std::list<Doc_frec*>::iterator it = this->duplas.begin();
	while (it != this->duplas.end()) {
		doc = (*it)->doc;
		frec = (*it)->frec;
		memcpy(&buffer[(*pos_actual)], &doc, 4);
		(*pos_actual) = (*pos_actual) + 4;
		memcpy(&buffer[(*pos_actual)], &frec, 4);
		(*pos_actual) = (*pos_actual) + 4;

 		it++;
	}
}

int TerminoSimplificado::size() {
	return this->tamanio;
}
